// 前缀和
// 本质上是一个动态规划的思想，关键步骤如下：
// 1.确定状态表示
// 2.推导动态转移方程
// 3.初始化
// 4.确定填表顺序
// 5.确定返回值

// 例题 1：
// 描述
// 给定一个长度为n的数组a1,a2,...,an.
// 接下来有q次查询, 每次查询有两个参数l, r.
// 对于每个询问, 请输出a[l],a[l + 1],...,+a[r]

// 输入描述：
//        第一行包含两个整数n和q.
//        第二行包含n个整数, 表示a[1],a[2],...,a[n].
//        接下来q行,每行包含两个整数   l和r.
//        1 ≤ n, q <= 105
//        1 ≤ n,q ≤ 10 5
//        -109 <= a[i] <= 109
//        1 <= l <= r <= n

// 输出描述：
//        输出q行,每行代表一次查询的结果.

//        示例1
//        输入：
//        3 2
//        1 2 4
//        1 2
//        2 3
//
//        输出：
//        3
//        6

// 解题思路：
// dp[i] 表示 a[1] + a[2] + ... + a[i]，前 i 项和
// dp[i] = dp[i - 1] + a[i]
// ret = dp[r] - dp[l - 1]

import java.util.Scanner;

public class Template1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int q = in.nextInt();
        int[] a = new int[n + 1];
        int index = 1;
        // 注意 hasNext 和 hasNextLine 的区别
        while (index <= n) { // 注意 while 处理多个 case
            a[index] = in.nextInt();
            index++;
        }
        long[] dp = new long[n + 1];
        for(int i = 1; i <= n; i++){
            dp[i] = dp[i - 1] + a[i];
        }
        while(q > 0){
            q--;
            int left = in.nextInt();
            int right = in.nextInt();
            System.out.println(dp[right] - dp[left - 1]);
        }
    }
}